package com.jh3502.helper.utils.ttshelper;

import android.app.Activity;
import android.media.AudioManager;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;

import com.baidu.tts.auth.AuthInfo;
import com.baidu.tts.client.SpeechSynthesizer;
import com.baidu.tts.client.SpeechSynthesizerListener;
import com.baidu.tts.client.TtsMode;

import java.io.IOException;

/**
 * Created by xiaowen on 2017/11/3.
 */

public class Speaker {


    // ================== 初始化参数设置开始 ==========================
    private static final String TAG = "Speaker";
    private static boolean isPermissionRequested = false;
    @Nullable
    protected SpeechSynthesizer mSpeechSynthesizer;
    /**
     * 发布时请替换成自己申请的appId appKey 和 secretKey。注意如果需要离线合成功能,请在您申请的应用中填写包名。
     */
//    private String appId = "10318618";
//
//    private String appKey = "cOvGbUOyDr0gVyML07543vnY";
//
//    private String secretKey = "5280e6434339c695eee267ff373567a4";

    @NonNull
    private String appId = "11041258";
    @NonNull
    private String appKey = "pCBxjjM2TfWBSOvHVZbiAtKw";
    @NonNull
    private String secretKey = "exTqscZ34T1pNIhfDW2eWhwcxvU4qbKm";
    // TtsMode.MIX; 离在线融合，在线优先； TtsMode.MIX 纯在线； 没有纯离线
    @NonNull
    private TtsMode ttsMode = TtsMode.MIX;
    private Activity activity;

    public Speaker(Activity activity) {
        this.activity = activity;

        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                initTTs();
            }
        });
        thread.run();
        // 线程池
       /* ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(3, 5,
                1, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(128));

        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                initTTs();
            }
        };
        poolExecutor.execute(runnable);*/

    }

    public void speeking(String text) {
        int result = mSpeechSynthesizer.speak(text);
        checkResult(result, "speak");
    }

    /**
     * 初始化TTS
     */
    private void initTTs() {
        SpeechSynthesizerListener listener = new MessageListener();
        //获取 SpeechSynthesizer 实例
        mSpeechSynthesizer = SpeechSynthesizer.getInstance();
        //设置使用环境
        mSpeechSynthesizer.setContext(activity);
        //注册监听其
        mSpeechSynthesizer.setSpeechSynthesizerListener(listener);
//        /**
//         * 授权检验接口
//         * 测试AppId，AppKey AppSecret填写正确，语音合成服务是否开通。
//         * 在线合成模式下，验证权限。首次验证时比较耗时，第一次调用成功，之后可以不必调用。
//         */
//        mSpeechSynthesizer.auth(ttsMode);
        /**
         * 设置 App Id和 App Key 及 App Secret
         * 用户在语音官网或者百度云网站上申请语音合成的应用后，会有appId appKey及appSecret
         */
        int result = mSpeechSynthesizer.setAppId(appId);
        checkResult(result, "setAppId");
        result = mSpeechSynthesizer.setApiKey(appKey, secretKey);
        checkResult(result, "setApiKey");

        //设置合成参数
        // 以下setParam 参数选填。不填写则默认值生效
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "2"); // 设置在线发声音人： 0 普通女声（默认） 1 普通男声 2 特别男声 3 情感男声<度逍遥> 4 情感儿童声<度丫丫>
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_VOLUME, "9"); // 设置合成的音量，0-9 ，默认 5
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEED, "8");// 设置合成的语速，0-9 ，默认 5
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_PITCH, "5");// 设置合成的语调，0-9 ，默认 5
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_MIX_MODE, SpeechSynthesizer.MIX_MODE_DEFAULT);

        // 4. 支持离线的话，需要设置离线模型
        // 检查离线授权文件是否下载成功，离线授权文件联网时SDK自动下载管理，有效期3年，3年后的最后一个月自动更新。
        boolean isSuccess = checkAuth();
        if (!isSuccess) {
            return;
        }
        // 离线资源文件， 从assets目录中复制到临时目录，需要在initTTs方法前完成
        OfflineResource offlineResource = createOfflineResource(OfflineResource.VOICE_MALE);
        // 声学模型文件路径 (离线引擎使用), 请确认下面两个文件存在
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_TEXT_MODEL_FILE, offlineResource.getTextFilename());
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_SPEECH_MODEL_FILE, offlineResource.getModelFilename());

        /**
         * 初始化合成引擎
         * 设置合成的参数后，需要调用此方法初始化
         */
        result = mSpeechSynthesizer.initTts(ttsMode);
        checkResult(result, "initTts");

        //设置音频流类型
        mSpeechSynthesizer.setAudioStreamType(AudioManager.MODE_IN_CALL);
    }

    private boolean checkAuth() {
        AuthInfo authInfo = mSpeechSynthesizer.auth(ttsMode);
        if (!authInfo.isSuccess()) {
            // 离线授权需要网站上的应用填写包名。本demo的包名是com.baidu.tts.sample，定义在build.gradle中
            String errorMsg = authInfo.getTtsError().getDetailMessage();
            print("【error】鉴权失败 errorMsg=" + errorMsg);
            return false;
        } else {
            print("验证通过，离线正式授权文件存在。");
            return true;
        }
    }

    @Nullable
    protected OfflineResource createOfflineResource(String voiceType) {
        OfflineResource offlineResource = null;
        try {
            offlineResource = new OfflineResource(activity, voiceType);
        } catch (IOException e) {
            // IO 错误自行处理
            e.printStackTrace();
        }
        return offlineResource;
    }

    private void print(String message) {
        Log.i(TAG, message);
    }

    private void checkResult(int result, String method) {
        if (result != 0) {
            print("error code :" + result + " method:" + method + ", 错误码文档:http://yuyin.baidu.com/docs/tts/122 ");
        }
    }

    public void destory() {
        if (mSpeechSynthesizer != null) {
            mSpeechSynthesizer.stop();
            mSpeechSynthesizer.release();
            mSpeechSynthesizer = null;
            print("释放资源成功");
        }
    }
}